<!doctype html>
<html lang="zh-CN">
<head>

    <meta charset="utf-8">
    <meta name="generator" content="Hugo 0.74.1" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>使用 jsdelivr 加速 cocoapod 库 | caijinglong的博客</title>
    <meta property="og:title" content="使用 jsdelivr 加速 cocoapod 库 - caijinglong的博客">
    <meta property="og:type" content="article">
        
    <meta property="article:published_time" content="2020-03-18T13:17:37&#43;08:00">
        
        
    <meta property="article:modified_time" content="2020-03-18T13:17:37&#43;08:00">
        
    <meta name="Keywords" content="golang,go语言,flutter,caijinglong,java,android,博客,项目管理,python,软件架构,公众号,小程序">
    <meta name="description" content="使用 jsdelivr 加速 cocoapod 库">
        
    <meta name="author" content="caijinglong">
    <meta property="og:url" content="http://www.kikt.top/posts/ios/pod-use-jsdelivr-cdn-to/">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">

    <link rel="stylesheet" href="/css/normalize.css">
    
        <link rel="stylesheet" href="/css/prism.css">
    
    <link rel="stylesheet" href="/css/style.css">
    <script type="text/javascript" src="//cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>

    

   
    <script>
        (function(){
            var bp = document.createElement('script');
            var curProtocol = window.location.protocol.split(':')[0];
            if (curProtocol === 'https') {
                bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
            }
            else {
                bp.src = 'http://push.zhanzhang.baidu.com/push.js';
            }
            var s = document.getElementsByTagName("script")[0];
            s.parentNode.insertBefore(bp, s);
        })();
    </script>

    
    
</head>

<body>
<header id="header" class="clearfix">
    <div class="container">
        <div class="col-group">
            <div class="site-name ">
                
                    <a id="logo" href="http://www.kikt.top">
                        caijinglong的博客
                    </a>
                
                <p class="description">Android/Flutter开发者，对于golang/python/ios/java 均有所了解</p>
            </div>
            <div>
                <nav id="nav-menu" class="clearfix">
                    <a class="" href="http://www.kikt.top">首页</a>
                    
                    <a  href="http://www.kikt.top/archives/" title="归档">归档</a>
                    
                    <a  href="http://www.kikt.top/contact/" title="接单">接单</a>
                    
                    <a  href="http://www.kikt.top/about/" title="关于">关于</a>
                    
                </nav>
            </div>
        </div>
    </div>
</header>


<div id="body">
    <div class="container">
        <div class="col-group">

            <div class="col-8" id="main">
                <div class="res-cons">
                    <article class="post">
                        <header>
                            <h1 class="post-title">使用 jsdelivr 加速 cocoapod 库</h1>
                        </header>
                        <date class="post-meta meta-date">
                            2020年3月18日
                        </date>
                        
                        <div class="post-meta meta-category">
                            |
                            
                                <a href="http://www.kikt.top/categories/flutter">flutter</a>
                            
                                <a href="http://www.kikt.top/categories/iOS">iOS</a>
                            
                        </div>
                        
                        
                        <div class="post-meta">
                            <span id="busuanzi_container_page_pv">|<span id="busuanzi_value_page_pv"></span><span> 阅读</span></span>
                        </div>
                        
                        <div class="post-content">
                            <p>iOS 开发时, cocoapods(后简称 pod) 是很常用的工具</p>
<p>我们偶尔也会自己开发 pod 库并上传到 pod 上</p>
<p>pod 的源码支持多种来源, 本地 path git http 等</p>
<p>一般来说, 如果是纯开源库, 我们直接把源码上传到 github , 然后使用 git 依赖即可</p>
<p><strong>但是</strong>这有一个问题, github 的速度在中国大陆并不快, 我们有没有办法加速它呢?</p>
<p>这时候经过搜索, jsdelivr 出现在了搜索引擎里, 号称国内外都可用的 cdn, 我用 wget 测试了一下, 国内外都可以保证 10M+/s 的速度</p>
<h2 id="jsdelivr-介绍">jsdelivr 介绍</h2>
<p>这东西本身最初目的是为了加速 js/css 的访问</p>
<p>但是, 上面也说了, 支持&quot;任何&quot;在 github 上的仓库, 很好, 我就喜欢这样的东西</p>
<h3 id="版本号的坑">版本号的坑</h3>
<p>文档上说支持所有 ref 作为版本号, 然而不是, 我这里测试只支持 tag/release</p>
<h3 id="包体大小限制">包体大小限制</h3>
<p>我的目的是为了给 flutter_ijkplayer 的 iOS 仓库找一个下载地址, ijkplayer 的 iOS 部分很大, 我打包完有 150M, 用了 xz 压缩方案让包变成了 35M</p>
<p>但 jsdelivr 有两个限制: 单文件不能大于 20M, 仓库的某版本不能大于 50M, 那这里就有问题了, 我的 xz 是 35M, 超过限制了, 这里我就要找解决方案了</p>
<h2 id="解决之路">解决之路</h2>
<h3 id="思考">思考</h3>
<p>首先是分拆, 这个好说, macOS 的 split 命令就支持</p>
<p>那合并呢? cat 命令就可以了</p>
<p>但怎么在 pod 中做呢, 我搜了一下 podspec 的语法, 发现可以配置 prepare_command 参数, 这个参数在安装时会被使用, 并且使用完毕后才会校验库是否存在</p>
<p>我们可以在这一步中来做真实的下载和合并操作</p>
<p>有了完整思路, 我要开始着手实施了</p>
<h2 id="发包">发包</h2>
<p>前提:
假设我本地有一个 framework.tar.xz, 这个是已经打包好的库文件</p>
<h3 id="分割文件">分割文件</h3>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">split -b 10m IJKMediaFramework.tar.xz IJKMediaFramework.tar.xz.
</code></pre></div><p>这里要注意最后一个参数最后有一个. 这样就能完成拆分</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">ll IJKMediaFramework.tar.xz*
-rw-r--r--  <span style="color:#ae81ff">1</span> caijinglong  staff    33M  <span style="color:#ae81ff">3</span> <span style="color:#ae81ff">18</span> 11:34 IJKMediaFramework.tar.xz
-rw-r--r--  <span style="color:#ae81ff">1</span> caijinglong  staff    10M  <span style="color:#ae81ff">3</span> <span style="color:#ae81ff">18</span> 11:34 IJKMediaFramework.tar.xz.aa
-rw-r--r--  <span style="color:#ae81ff">1</span> caijinglong  staff    10M  <span style="color:#ae81ff">3</span> <span style="color:#ae81ff">18</span> 11:34 IJKMediaFramework.tar.xz.ab
-rw-r--r--  <span style="color:#ae81ff">1</span> caijinglong  staff    10M  <span style="color:#ae81ff">3</span> <span style="color:#ae81ff">18</span> 11:34 IJKMediaFramework.tar.xz.ac
-rw-r--r--  <span style="color:#ae81ff">1</span> caijinglong  staff   3.0M  <span style="color:#ae81ff">3</span> <span style="color:#ae81ff">18</span> 11:34 IJKMediaFramework.tar.xz.ad
</code></pre></div><h3 id="测试一下合并">测试一下合并</h3>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">cat IJKMediaFramework.tar.xz.* &gt; IJKMediaFramework-Test.tar.xz

ll IJKMediaFramework-Test.tar.xz
-rw-r--r--  <span style="color:#ae81ff">1</span> caijinglong  staff    33M  <span style="color:#ae81ff">3</span> <span style="color:#ae81ff">18</span> 13:58 IJKMediaFramework-Test.tar.xz
</code></pre></div><p>这里大小是 ok 的. 再解压一下试试</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">mkdir test
mv IJKMediaFramework-Test.tar.xz test
cd test
tar xvf IJKMediaFramework-Test.tar.xz


ll
drwxr-xr-x  <span style="color:#ae81ff">7</span> caijinglong  staff   224B  <span style="color:#ae81ff">3</span> <span style="color:#ae81ff">18</span> 11:33 IJKMediaFramework.framework
-rw-r--r--  <span style="color:#ae81ff">1</span> caijinglong  staff   1.0K  <span style="color:#ae81ff">3</span> <span style="color:#ae81ff">18</span> 11:33 LICENSE

ll IJKMediaFramework.framework
total <span style="color:#ae81ff">295944</span>
drwxr-xr-x  <span style="color:#ae81ff">14</span> caijinglong  staff   448B  <span style="color:#ae81ff">3</span> <span style="color:#ae81ff">18</span> 11:33 Headers
-rw-r--r--   <span style="color:#ae81ff">1</span> caijinglong  staff   130M  <span style="color:#ae81ff">3</span> <span style="color:#ae81ff">18</span> 11:33 IJKMediaFramework
-rw-r--r--   <span style="color:#ae81ff">1</span> caijinglong  staff   757B  <span style="color:#ae81ff">3</span> <span style="color:#ae81ff">18</span> 11:33 Info.plist
drwxr-xr-x   <span style="color:#ae81ff">3</span> caijinglong  staff    96B  <span style="color:#ae81ff">3</span> <span style="color:#ae81ff">18</span> 11:33 Modules
drwxr-xr-x   <span style="color:#ae81ff">4</span> caijinglong  staff   128B  <span style="color:#ae81ff">3</span> <span style="color:#ae81ff">18</span> 11:33 libyuv
</code></pre></div><p>解压缩也成功了, 接着就是编写脚本了</p>
<h3 id="合并脚本">合并脚本</h3>
<p>我创建了一个 cat.sh 脚本</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">wget https://cdn.jsdelivr.net/gh/CaiJingLong/flutter_ijkplayer_pod_spliter@0.2.2/IJKMediaFramework.tar.xz.aa
wget https://cdn.jsdelivr.net/gh/CaiJingLong/flutter_ijkplayer_pod_spliter@0.2.2/IJKMediaFramework.tar.xz.ab
wget https://cdn.jsdelivr.net/gh/CaiJingLong/flutter_ijkplayer_pod_spliter@0.2.2/IJKMediaFramework.tar.xz.ac
wget https://cdn.jsdelivr.net/gh/CaiJingLong/flutter_ijkplayer_pod_spliter@0.2.2/IJKMediaFramework.tar.xz.ad
cat IJKMediaFramework.tar.xz.* &gt; IJKMediaFramework.tar.xz
tar xvf IJKMediaFramework.tar.xz
rm IJKMediaFramework.tar.xz.* IJKMediaFramework.tar.xz
</code></pre></div><p>这个脚本会完成下载, 连接, 解压, 删除压缩包的过程, 这样剩余的就是干净的文件了, 只包含 Framework LICENSE README</p>
<h3 id="上传-github">上传 github</h3>
<p>这里根据你自己的情况选择上传方式, 我是用的 python 脚本配合 github 的 rest v3 api 上传的, 你可以用 git 或者 gihtub 的网页端
接着有一步很重要的步骤, release 这个版本, 不然 jsdelivr 找不到</p>
<p>我的脚本地址: <a href="https://gitee.com/kikt/ijkplayer_thrid_party/blob/master/ios/pod/upload.py">https://gitee.com/kikt/ijkplayer_thrid_party/blob/master/ios/pod/upload.py</a> 需要配置两个环境变量 一个是版本号 一个是 GITHUB_TOKEN, 当然如果想要用的话, 还是需要其他修改的, 比如仓库名, 拥有者名等等信息</p>
<h3 id="podspec">podspec</h3>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-rb" data-lang="rb"><span style="color:#66d9ef">Pod</span><span style="color:#f92672">::</span><span style="color:#66d9ef">Spec</span><span style="color:#f92672">.</span>new <span style="color:#66d9ef">do</span> <span style="color:#f92672">|</span>spec<span style="color:#f92672">|</span>

  version <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;0.2.2&#34;</span>
  spec<span style="color:#f92672">.</span>name         <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;FlutterIJK&#34;</span>
  spec<span style="color:#f92672">.</span>version      <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">#{</span>version<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
  spec<span style="color:#f92672">.</span>summary      <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;IJKPlayer for Flutter.&#34;</span>
  spec<span style="color:#f92672">.</span>description  <span style="color:#f92672">=</span> <span style="color:#e6db74">&lt;&lt;-DESC
</span><span style="color:#e6db74"></span>  <span style="color:#66d9ef">IJKPlayer</span> <span style="color:#66d9ef">for</span> flutter
                   <span style="color:#66d9ef">DESC</span>

  spec<span style="color:#f92672">.</span>homepage     <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;https://github.com/CaiJingLong/flutter_ijkplayer_pod&#34;</span>
  spec<span style="color:#f92672">.</span>license      <span style="color:#f92672">=</span> { <span style="color:#e6db74">:type</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#39;MIT&#39;</span>, <span style="color:#e6db74">:file</span> <span style="color:#f92672">=&gt;</span><span style="color:#e6db74">&#39;LICENSE&#39;</span> }
  spec<span style="color:#f92672">.</span>author             <span style="color:#f92672">=</span> { <span style="color:#e6db74">&#34;Caijinglong&#34;</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#34;cjl_spy@163.com&#34;</span> }
  spec<span style="color:#f92672">.</span>source       <span style="color:#f92672">=</span> { <span style="color:#e6db74">:http</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#34;https://cdn.jsdelivr.net/gh/CaiJingLong/flutter_ijkplayer_pod_spliter@</span><span style="color:#e6db74">#{</span>version<span style="color:#e6db74">}</span><span style="color:#e6db74">/README.tar.gz&#34;</span>}
  spec<span style="color:#f92672">.</span>vendored_frameworks <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;IJKMediaFramework.framework&#39;</span>
  spec<span style="color:#f92672">.</span>frameworks  <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;AudioToolbox&#34;</span>, <span style="color:#e6db74">&#34;AVFoundation&#34;</span>, <span style="color:#e6db74">&#34;CoreGraphics&#34;</span>, <span style="color:#e6db74">&#34;CoreMedia&#34;</span>, <span style="color:#e6db74">&#34;CoreVideo&#34;</span>, <span style="color:#e6db74">&#34;MobileCoreServices&#34;</span>, <span style="color:#e6db74">&#34;OpenGLES&#34;</span>, <span style="color:#e6db74">&#34;QuartzCore&#34;</span>, <span style="color:#e6db74">&#34;VideoToolbox&#34;</span>, <span style="color:#e6db74">&#34;Foundation&#34;</span>, <span style="color:#e6db74">&#34;UIKit&#34;</span>, <span style="color:#e6db74">&#34;MediaPlayer&#34;</span>
  spec<span style="color:#f92672">.</span>libraries   <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;bz2&#34;</span>, <span style="color:#e6db74">&#34;z&#34;</span>, <span style="color:#e6db74">&#34;stdc++&#34;</span>

  spec<span style="color:#f92672">.</span>platform <span style="color:#f92672">=</span> <span style="color:#e6db74">:ios</span>
  spec<span style="color:#f92672">.</span>ios<span style="color:#f92672">.</span>deployment_target <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;8.0&#39;</span>
  spec<span style="color:#f92672">.</span>requires_arc <span style="color:#f92672">=</span> <span style="color:#66d9ef">true</span>

  spec<span style="color:#f92672">.</span>prepare_command <span style="color:#f92672">=</span> <span style="color:#e6db74">&lt;&lt;-CMD
</span><span style="color:#e6db74"></span>    sh cat<span style="color:#f92672">.</span>sh
  <span style="color:#66d9ef">CMD</span>
<span style="color:#66d9ef">end</span>
</code></pre></div><p>这样在 pod install 的过程中会完成如下步骤</p>
<ol>
<li>下载 <code>https://cdn.jsdelivr.net/gh/CaiJingLong/flutter_ijkplayer_pod_spliter@#{version}/README.tar.gz</code> 文件 version 是字符串插值的版本号</li>
<li>pod 会帮我们解压这个 gz</li>
<li>运行 gz 中的 cat.sh 脚本来完成下载, 合并, 删除多余文件的操作</li>
</ol>
<p>trunk, 也就是上传的信息:</p>
<pre><code class="language-log" data-lang="log">Updating spec repo `trunk`
  CDN: trunk Relative path: deprecated_podspecs.txt modified during this run! Returning local
  CDN: trunk Going to update 15 files
  CDN: trunk Relative path: all_pods_versions_1_1_5.txt modified during this run! Returning local
  CDN: trunk Relative path: all_pods_versions_4_9_1.txt modified during this run! Returning local
  CDN: trunk Relative path: all_pods_versions_1_1_7.txt modified during this run! Returning local
  CDN: trunk Relative path: all_pods_versions_5_d_c.txt modified during this run! Returning local
  CDN: trunk Relative path: AlgoliaSearch.yml modified during this run! Returning local
  CDN: trunk Relative path: all_pods_versions_e_9_d.txt modified during this run! Returning local
  CDN: trunk Relative path: all_pods_versions_2_1_1.txt modified during this run! Returning local
  CDN: trunk Relative path: CocoaPods-version.yml modified during this run! Returning local
  CDN: trunk Relative path: all_pods_versions_7_f_a.txt modified during this run! Returning local
  CDN: trunk Relative path: all_pods_versions_d_6_9.txt modified during this run! Returning local
  CDN: trunk Relative path: all_pods_versions_6_0_4.txt modified during this run! Returning local
  CDN: trunk Relative path: all_pods_versions_f_4_e.txt modified during this run! Returning local
  CDN: trunk Relative path: all_pods_versions_8_d_3.txt modified during this run! Returning local
  CDN: trunk Relative path: all_pods_versions_1_9_2.txt modified during this run! Returning local
  CDN: trunk Relative path: all_pods_versions_c_e_7.txt modified during this run! Returning local
  - Data URL: https://raw.githubusercontent.com/CocoaPods/Specs/48458c6e0cf376dcb2c374f6b349b960fefa883c/Specs/4/9/1/FlutterIJK/0.2.2/FlutterIJK.podspec.json
  - Log messages:
    - March 17th, 21:06: Push for `FlutterIJK 0.2.2' initiated.
    - March 17th, 21:06: Push for `FlutterIJK 0.2.2' has been pushed (0.922508893 s).

</code></pre><p>这样就完成了发包的全过程</p>
<h3 id="组织结构">组织结构</h3>
<p>下面是发包时的目录结构</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">tree output/
output/
├── IJKMediaFramework.framework
│   ├── Headers
│   │   ├── IJKAVMoviePlayerController.h
│   │   ├── IJKFFMonitor.h
│   │   ├── IJKFFMoviePlayerController.h
│   │   ├── IJKFFOptions.h
│   │   ├── IJKKVOController.h
│   │   ├── IJKMPMoviePlayerController.h
│   │   ├── IJKMediaFramework.h
│   │   ├── IJKMediaModule.h
│   │   ├── IJKMediaPlayback.h
│   │   ├── IJKMediaPlayer.h
│   │   ├── IJKNotificationManager.h
│   │   └── IJKSDLGLViewProtocol.h
│   ├── IJKMediaFramework
│   ├── Info.plist
│   ├── Modules
│   │   └── module.modulemap
│   └── libyuv
│       ├── include
│       │   ├── libyuv
│       │   │   ├── basic_types.h
│       │   │   ├── compare.h
│       │   │   ├── compare_row.h
│       │   │   ├── convert.h
│       │   │   ├── convert_argb.h
│       │   │   ├── convert_from.h
│       │   │   ├── convert_from_argb.h
│       │   │   ├── cpu_id.h
│       │   │   ├── macros_msa.h
│       │   │   ├── mjpeg_decoder.h
│       │   │   ├── planar_functions.h
│       │   │   ├── rotate.h
│       │   │   ├── rotate_argb.h
│       │   │   ├── rotate_row.h
│       │   │   ├── row.h
│       │   │   ├── scale.h
│       │   │   ├── scale_argb.h
│       │   │   ├── scale_row.h
│       │   │   ├── version.h
│       │   │   └── video_common.h
│       │   └── libyuv.h
│       └── lib
│           └── libyuv.a
├── IJKMediaFramework.tar.xz
├── IJKMediaFramework.tar.xz.aa
├── IJKMediaFramework.tar.xz.ab
├── IJKMediaFramework.tar.xz.ac
├── IJKMediaFramework.tar.xz.ad
├── LICENSE
├── README.md
├── README.tar.gz
├── cat.sh
└── files
</code></pre></div><h3 id="lipo-脚本">lipo 脚本</h3>
<p>另外, 我的项目中, 我还编写了一个 lipo 脚本, 用于合并产物, 分割文件, 调用上传的 python</p>
<p><a href="https://gitee.com/kikt/ijkplayer_thrid_party/blob/master/ios/lipo_product.sh">https://gitee.com/kikt/ijkplayer_thrid_party/blob/master/ios/lipo_product.sh</a></p>
<h2 id="后记">后记</h2>
<p>本篇没有单独的仓库, 但是可以参考 <a href="https://gitee.com/kikt/ijkplayer_thrid_party/blob/master/ios/lipo_product.sh">https://gitee.com/kikt/ijkplayer_thrid_party/blob/master/ios/lipo_product.sh</a> 来作为入口看整个过程</p>
<p>以上</p>

                        </div>

                        

<div class="post-archive">
    <h2>See Also</h2>
    <ul class="listing">
        
        <li><a href="/posts/flutter/compare/version-compare/">Flutter 版本更新内容查看</a></li>
        
        <li><a href="/posts/flutter/dart/generators/">dart中的生成器函数</a></li>
        
        <li><a href="/posts/flutter/channel/flutter-channel4/">Flutter 原生通信 (四) - iOS 通知 Flutter</a></li>
        
        <li><a href="/posts/flutter/channel/flutter-channel3/">Flutter 原生通信 (三) - Flutter 调用 iOS</a></li>
        
        <li><a href="/posts/flutter/flutter-self-library/">Flutter 本人开发的一些开源库</a></li>
        
    </ul>
</div>


                        <div class="post-meta meta-tags">
                            
                            <ul class="clearfix">
                                
                                <li><a href="http://www.kikt.top/tags/flutter">flutter</a></li>
                                
                                <li><a href="http://www.kikt.top/tags/iOS">iOS</a></li>
                                
                                <li><a href="http://www.kikt.top/tags/cocoapods">cocoapods</a></li>
                                
                                <li><a href="http://www.kikt.top/tags/github">github</a></li>
                                
                                <li><a href="http://www.kikt.top/tags/jsdelivr">jsdelivr</a></li>
                                
                            </ul>
                            
                        </div>
                    </article>
                    
    

    
    
    <div class="post bg-white">
      <script src="https://utteranc.es/client.js"
            repo= "caijinglong/kikt-blog-comment"
            issue-term="pathname"
            theme="github-light"
            crossorigin="anonymous"
            async>
      </script>
    </div>
    
                </div>
            </div>
            <div id="secondary">
    <section class="widget">
        <form id="search" action="//www.google.com/search" method="get" accept-charset="utf-8" target="_blank" _lpchecked="1">
      
      <input type="text" name="q" maxlength="20" placeholder="Search">
      <input type="hidden" name="sitesearch" value="http://www.kikt.top">
      <button type="submit" class="submit icon-search"></button>
</form>
    </section>
    
    <section class="widget">
        <h3 class="widget-title">最近文章</h3>
<ul class="widget-list">
    
    <li>
        <a href="http://www.kikt.top/posts/java/crack/crack1/" title="使用javassist,修改jar包方法实现">使用javassist,修改jar包方法实现</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/posts/github/actions/create/" title="Github action 的开发到发布">Github action 的开发到发布</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/posts/flutter/jenkins&#43;fastlane/" title="flutter Jenkins&#43;fastlane 自动化打测试包, 并上传蒲公英">flutter Jenkins&#43;fastlane 自动化打测试包, 并上传蒲公英</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/posts/go/compile-for-android/" title="编译 go 源码为 android 动态库(so)">编译 go 源码为 android 动态库(so)</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/posts/flutter/focusnode-2/" title="Flutter FocusNode 焦点那点事-(二)">Flutter FocusNode 焦点那点事-(二)</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/posts/flutter/focusnode-1/" title="Flutter FocusNode 焦点那点事-(一)">Flutter FocusNode 焦点那点事-(一)</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/posts/server/caddy/cros_for_local_dev/" title="用 Caddy 解决 web 开发中本地跨域的问题">用 Caddy 解决 web 开发中本地跨域的问题</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/posts/flutter/route/navigator-helper2/" title="Navigator Helper2">Navigator Helper2</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/posts/flutter/grey-app/" title="flutter 怎么实现app整体灰度">flutter 怎么实现app整体灰度</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/posts/flutter/plugin/flutter-sdk-import-aar/" title="Flutter 插件开发之引入aar到安卓部分 并使用本地maven">Flutter 插件开发之引入aar到安卓部分 并使用本地maven</a>
    </li>
    
</ul>
    </section>

    

    <section class="widget">
        <h3 class="widget-title">分类</h3>
<ul class="widget-list">
    
    <li>
        <a href="http://www.kikt.top/categories/android/">android(25)</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/categories/caddy/">caddy(1)</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/categories/dart/">dart(5)</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/categories/docker/">docker(3)</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/categories/flutter/">flutter(60)</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/categories/github/">github(3)</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/categories/go/">go(1)</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/categories/golang/">golang(1)</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/categories/iOS/">iOS(6)</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/categories/ios/">ios(1)</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/categories/java/">java(6)</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/categories/jetbrains/">jetbrains(1)</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/categories/other/">other(3)</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/categories/python/">python(1)</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/categories/server/">server(5)</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/categories/spring/">spring(3)</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/categories/tools/">tools(1)</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/categories/%E6%9D%82%E9%A1%B9/">杂项(1)</a>
    </li>
    
    <li>
        <a href="http://www.kikt.top/categories/%E6%B6%82%E9%B8%A6/">涂鸦(1)</a>
    </li>
    
</ul>
    </section>

    <section class="widget">
        <h3 class="widget-title">标签</h3>
<div class="tagcloud">
    
    <a href="http://www.kikt.top/tags/10/">10</a>
    
    <a href="http://www.kikt.top/tags/2.3/">2.3</a>
    
    <a href="http://www.kikt.top/tags/Clipboard/">Clipboard</a>
    
    <a href="http://www.kikt.top/tags/Javassist/">Javassist</a>
    
    <a href="http://www.kikt.top/tags/Migrate/">Migrate</a>
    
    <a href="http://www.kikt.top/tags/aar/">aar</a>
    
    <a href="http://www.kikt.top/tags/actions/">actions</a>
    
    <a href="http://www.kikt.top/tags/aidl/">aidl</a>
    
    <a href="http://www.kikt.top/tags/android/">android</a>
    
    <a href="http://www.kikt.top/tags/androidQ/">androidQ</a>
    
    <a href="http://www.kikt.top/tags/androidX/">androidX</a>
    
    <a href="http://www.kikt.top/tags/apk/">apk</a>
    
    <a href="http://www.kikt.top/tags/app/">app</a>
    
    <a href="http://www.kikt.top/tags/appcode/">appcode</a>
    
    <a href="http://www.kikt.top/tags/azure/">azure</a>
    
    <a href="http://www.kikt.top/tags/ble/">ble</a>
    
    <a href="http://www.kikt.top/tags/bottomsheet/">bottomsheet</a>
    
    <a href="http://www.kikt.top/tags/butterknife/">butterknife</a>
    
    <a href="http://www.kikt.top/tags/c/">c</a>
    
    <a href="http://www.kikt.top/tags/caddy/">caddy</a>
    
    <a href="http://www.kikt.top/tags/camera/">camera</a>
    
    <a href="http://www.kikt.top/tags/cameraX/">cameraX</a>
    
    <a href="http://www.kikt.top/tags/channel/">channel</a>
    
    <a href="http://www.kikt.top/tags/cocoapods/">cocoapods</a>
    
    <a href="http://www.kikt.top/tags/cupertino/">cupertino</a>
    
    <a href="http://www.kikt.top/tags/dart/">dart</a>
    
    <a href="http://www.kikt.top/tags/dart-2.6/">dart-2.6</a>
    
    <a href="http://www.kikt.top/tags/desktop/">desktop</a>
    
    <a href="http://www.kikt.top/tags/dialog/">dialog</a>
    
    <a href="http://www.kikt.top/tags/dmg/">dmg</a>
    
    <a href="http://www.kikt.top/tags/doc/">doc</a>
    
    <a href="http://www.kikt.top/tags/docker/">docker</a>
    
    <a href="http://www.kikt.top/tags/docker-compose/">docker-compose</a>
    
    <a href="http://www.kikt.top/tags/excel/">excel</a>
    
    <a href="http://www.kikt.top/tags/exists/">exists</a>
    
    <a href="http://www.kikt.top/tags/faq/">faq</a>
    
    <a href="http://www.kikt.top/tags/fastlane/">fastlane</a>
    
    <a href="http://www.kikt.top/tags/ffi/">ffi</a>
    
    <a href="http://www.kikt.top/tags/ffmpeg/">ffmpeg</a>
    
    <a href="http://www.kikt.top/tags/flexmark/">flexmark</a>
    
    <a href="http://www.kikt.top/tags/flutter/">flutter</a>
    
    <a href="http://www.kikt.top/tags/flutter-web/">flutter-web</a>
    
    <a href="http://www.kikt.top/tags/focus/">focus</a>
    
    <a href="http://www.kikt.top/tags/focusNode/">focusNode</a>
    
    <a href="http://www.kikt.top/tags/form/">form</a>
    
    <a href="http://www.kikt.top/tags/framework/">framework</a>
    
    <a href="http://www.kikt.top/tags/github/">github</a>
    
    <a href="http://www.kikt.top/tags/go/">go</a>
    
    <a href="http://www.kikt.top/tags/golang/">golang</a>
    
    <a href="http://www.kikt.top/tags/gradle/">gradle</a>
    
    <a href="http://www.kikt.top/tags/http/">http</a>
    
    <a href="http://www.kikt.top/tags/iOS/">iOS</a>
    
    <a href="http://www.kikt.top/tags/ide/">ide</a>
    
    <a href="http://www.kikt.top/tags/idea/">idea</a>
    
    <a href="http://www.kikt.top/tags/index/">index</a>
    
    <a href="http://www.kikt.top/tags/inside/">inside</a>
    
    <a href="http://www.kikt.top/tags/ios/">ios</a>
    
    <a href="http://www.kikt.top/tags/java/">java</a>
    
    <a href="http://www.kikt.top/tags/jenkins/">jenkins</a>
    
    <a href="http://www.kikt.top/tags/jetbrains/">jetbrains</a>
    
    <a href="http://www.kikt.top/tags/jsdelivr/">jsdelivr</a>
    
    <a href="http://www.kikt.top/tags/json/">json</a>
    
    <a href="http://www.kikt.top/tags/json_serializable/">json_serializable</a>
    
    <a href="http://www.kikt.top/tags/junit/">junit</a>
    
    <a href="http://www.kikt.top/tags/library/">library</a>
    
    <a href="http://www.kikt.top/tags/live-template/">live-template</a>
    
    <a href="http://www.kikt.top/tags/loadmore/">loadmore</a>
    
    <a href="http://www.kikt.top/tags/log/">log</a>
    
    <a href="http://www.kikt.top/tags/mac/">mac</a>
    
    <a href="http://www.kikt.top/tags/macos/">macos</a>
    
    <a href="http://www.kikt.top/tags/maven/">maven</a>
    
    <a href="http://www.kikt.top/tags/mysql/">mysql</a>
    
    <a href="http://www.kikt.top/tags/navigationbar/">navigationbar</a>
    
    <a href="http://www.kikt.top/tags/navigator/">navigator</a>
    
    <a href="http://www.kikt.top/tags/ndk/">ndk</a>
    
    <a href="http://www.kikt.top/tags/nginx/">nginx</a>
    
    <a href="http://www.kikt.top/tags/oc/">oc</a>
    
    <a href="http://www.kikt.top/tags/opencv/">opencv</a>
    
    <a href="http://www.kikt.top/tags/poi/">poi</a>
    
    <a href="http://www.kikt.top/tags/pub/">pub</a>
    
    <a href="http://www.kikt.top/tags/python/">python</a>
    
    <a href="http://www.kikt.top/tags/retrofit/">retrofit</a>
    
    <a href="http://www.kikt.top/tags/route/">route</a>
    
    <a href="http://www.kikt.top/tags/server/">server</a>
    
    <a href="http://www.kikt.top/tags/so/">so</a>
    
    <a href="http://www.kikt.top/tags/spp/">spp</a>
    
    <a href="http://www.kikt.top/tags/sprintboot/">sprintboot</a>
    
    <a href="http://www.kikt.top/tags/swift/">swift</a>
    
    <a href="http://www.kikt.top/tags/tap/">tap</a>
    
    <a href="http://www.kikt.top/tags/thymeleaf/">thymeleaf</a>
    
    <a href="http://www.kikt.top/tags/tips/">tips</a>
    
    <a href="http://www.kikt.top/tags/toast/">toast</a>
    
    <a href="http://www.kikt.top/tags/transition/">transition</a>
    
    <a href="http://www.kikt.top/tags/ui/">ui</a>
    
    <a href="http://www.kikt.top/tags/utf8/">utf8</a>
    
    <a href="http://www.kikt.top/tags/yield/">yield</a>
    
    <a href="http://www.kikt.top/tags/%E4%BA%8C%E8%BF%9B%E5%88%B6/">二进制</a>
    
    <a href="http://www.kikt.top/tags/%E4%BA%A4%E5%8F%89/">交叉</a>
    
    <a href="http://www.kikt.top/tags/%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%91/">交叉编译</a>
    
    <a href="http://www.kikt.top/tags/%E4%BB%8B%E7%BB%8D/">介绍</a>
    
    <a href="http://www.kikt.top/tags/%E4%BB%A3%E7%A0%81%E8%A7%84%E8%8C%83/">代码规范</a>
    
    <a href="http://www.kikt.top/tags/%E5%86%B2%E7%AA%81/">冲突</a>
    
    <a href="http://www.kikt.top/tags/%E5%8A%A8%E6%80%81/">动态</a>
    
    <a href="http://www.kikt.top/tags/%E5%8F%91%E5%B8%83/">发布</a>
    
    <a href="http://www.kikt.top/tags/%E5%8F%AF%E6%89%A7%E8%A1%8C/">可执行</a>
    
    <a href="http://www.kikt.top/tags/%E5%9B%BE%E5%BA%8A/">图床</a>
    
    <a href="http://www.kikt.top/tags/%E5%9F%8E%E5%B8%82/">城市</a>
    
    <a href="http://www.kikt.top/tags/%E5%A4%A7%E6%96%87%E4%BB%B6/">大文件</a>
    
    <a href="http://www.kikt.top/tags/%E5%B7%A5%E5%85%B7/">工具</a>
    
    <a href="http://www.kikt.top/tags/%E5%B7%B2%E6%9C%89%E9%A1%B9%E7%9B%AE/">已有项目</a>
    
    <a href="http://www.kikt.top/tags/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/">开发环境</a>
    
    <a href="http://www.kikt.top/tags/%E6%80%BB%E7%BB%93/">总结</a>
    
    <a href="http://www.kikt.top/tags/%E6%85%A2/">慢</a>
    
    <a href="http://www.kikt.top/tags/%E6%89%93%E5%8C%85/">打包</a>
    
    <a href="http://www.kikt.top/tags/%E6%89%AB%E7%A0%81/">扫码</a>
    
    <a href="http://www.kikt.top/tags/%E6%8F%92%E4%BB%B6/">插件</a>
    
    <a href="http://www.kikt.top/tags/%E6%96%87%E6%A1%A3/">文档</a>
    
    <a href="http://www.kikt.top/tags/%E6%A8%A1%E6%9D%BF/">模板</a>
    
    <a href="http://www.kikt.top/tags/%E6%B8%B2%E6%9F%93/">渲染</a>
    
    <a href="http://www.kikt.top/tags/%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90/">源码解析</a>
    
    <a href="http://www.kikt.top/tags/%E7%81%B0%E5%BA%A6/">灰度</a>
    
    <a href="http://www.kikt.top/tags/%E7%82%B9%E5%87%BB/">点击</a>
    
    <a href="http://www.kikt.top/tags/%E7%84%A6%E7%82%B9/">焦点</a>
    
    <a href="http://www.kikt.top/tags/%E7%88%AC%E8%99%AB/">爬虫</a>
    
    <a href="http://www.kikt.top/tags/%E7%8A%B6%E6%80%81%E7%AE%A1%E7%90%86/">状态管理</a>
    
    <a href="http://www.kikt.top/tags/%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BE/">百度地图</a>
    
    <a href="http://www.kikt.top/tags/%E7%BC%96%E7%A0%81/">编码</a>
    
    <a href="http://www.kikt.top/tags/%E7%BC%96%E7%A8%8B%E6%8A%80%E5%B7%A7/">编程技巧</a>
    
    <a href="http://www.kikt.top/tags/%E7%BC%96%E8%AF%91/">编译</a>
    
    <a href="http://www.kikt.top/tags/%E7%BF%BB%E8%AF%91/">翻译</a>
    
    <a href="http://www.kikt.top/tags/%E8%93%9D%E7%89%99/">蓝牙</a>
    
    <a href="http://www.kikt.top/tags/%E8%A1%A8%E5%8D%95/">表单</a>
    
    <a href="http://www.kikt.top/tags/%E8%B7%AF%E7%94%B1/">路由</a>
    
    <a href="http://www.kikt.top/tags/%E8%BF%87%E5%9C%BA%E5%8A%A8%E7%94%BB/">过场动画</a>
    
    <a href="http://www.kikt.top/tags/%E9%9A%90%E7%A7%81/">隐私</a>
    
</div>
    </section>

    
<section class="widget">
    <h3 class="widget-title">友情链接</h3>
    <ul class="widget-list">
        
        <li>
            <a target="_blank" href="https://github.com/Caijinglong" title="我的Github">我的Github</a>
        </li>
        
        <li>
            <a target="_blank" href="https://flutter.dev" title="flutter 官网">flutter 官网</a>
        </li>
        
    </ul>
</section>


    <section class="widget">
        <h3 class="widget-title">其它</h3>
        <ul class="widget-list">
            <li><a href="http://www.kikt.top/index.xml">文章 RSS</a></li>
        </ul>
    </section>
</div>
        </div>
    </div>
</div>
<footer id="footer">
    <div class="container">
        <div>
            <p>如果我的blog对您有帮助,而您愿意捐赠 😆, 可以用下面的二维码</p>
            <img style="width:5rem;" src="https://dev.azure.com/cjlspy/844861b8-ee45-48a3-b430-b974684baaaa/_apis/git/repositories/bf4da1c1-1cfa-4f54-8a75-745cce2b737c/items?versionDescriptor%5Bversion%5D=master&versionDescriptor%5BversionOptions%5D=0&versionDescriptor%5BversionType%5D=0&resolveLfs=true&%24format=octetStream&api-version=5.0&path=%2F20190424141834.png"/>
            <img style="width:5rem; padding-left: 2rem;" 
            src="https://dev.azure.com/cjlspy/844861b8-ee45-48a3-b430-b974684baaaa/_apis/git/repositories/bf4da1c1-1cfa-4f54-8a75-745cce2b737c/items?versionDescriptor%5Bversion%5D=master&versionDescriptor%5BversionOptions%5D=0&versionDescriptor%5BversionType%5D=0&resolveLfs=true&%24format=octetStream&api-version=5.0&path=%2F20190424141931.png"/>
            <img style="width:5rem; padding-left: 2rem;" 
            src="https://dev.azure.com/cjlspy/844861b8-ee45-48a3-b430-b974684baaaa/_apis/git/repositories/bf4da1c1-1cfa-4f54-8a75-745cce2b737c/items?versionDescriptor%5Bversion%5D=master&versionDescriptor%5BversionOptions%5D=0&versionDescriptor%5BversionType%5D=0&resolveLfs=true&%24format=octetStream&api-version=5.0&path=%2F20190424142013.png"/>
        </div>
        &copy; 2018 <a href="http://www.kikt.top">caijinglong的博客 By caijinglong</a>.
        Powered by <a rel="nofollow noreferer noopener" href="https://gohugo.io" target="_blank">Hugo</a>.
        <a href="http://www.flysnow.org/" target="_blank">Theme</a> based on <a href="https://github.com/rujews/maupassant-hugo" target="_blank">maupassant</a>.<br/>
        本站所有内容基于<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh" style="color:coral">CC4.0</a>协议发布,需要转载必须署名
        <br/>
        如果有问题可以<a href="mailto:cjl_spy@163.com">email联系我</a>
        <br/>
        京ICP备18038473号-1
        
    </div>
</footer>


    <script type="text/javascript" src="/js/prism.js" async="true"></script>
    <script type="text/javascript">
    
    (function(){
        $("pre code").parent().addClass("line-numbers")
    }())

    window.MathJax = {
        tex2jax: {
            inlineMath: [ ['$','$'] ],
            processEscapes: true
        }
    };
    </script>
    <script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML' async></script>

<a id="rocket" href="#top"></a>
<script type="text/javascript" src="/js/totop.js?v=0.0.0" async=""></script>



<script type="text/javascript" src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js" async></script>




</body>
</html>
